/**
主要回顾：单例设计模式

饿汉单例设计模式：（不管三七二十一，先创建对象再说）
    1.私有化构造函数（让别人没法随便 new）
    2.声明本类的引用类型静态变量，并且使用该变量指向本类对象
    3.提供一个获取本类对象的公共静态方法
    
懒汉单例设计模式：（懒，当用到对象再创建）
    1.私有化构造函数
    2.声明本类的引用类型静态变量，但先不创建对象
    3.提供一个获取本类对象的公共静态方法，获取之前判断是否已经创建了本类对象
        若已经创建，则直接返回；否则先创建，再返回
        
懒汉单例设计模式存在线程安全问题，使用需谨慎
*/

class SingleH{
    //声明本类的引用类型静态变量，并且使用该变量指向本类对象
    private static SingleH s = new SingleH();
    
    //私有化构造函数
    private SingleH(){}
    
    //提供一个获取本类对象的公共静态方法
    public static SingleH getInstance(){
        return s;
    }
}

class SingleL{
    //私有化构造函数
    private SingleL(){}
    
    //声明本类的引用类型静态变量，但先不创建对象
    private static SingleL s = null;
    
    //提供一个获取本类对象的公共静态方法
    public static SingleL getInstance(){
        //获取之前先判断是否已经创建了本类对象
        if (s == null) {
            s = new SingleL();
        }
        
        return s;
    }
}

class LearnSingleton {
    public static void main(String[] args) {
//        new SingleH();    //报错：访问 private
        SingleH s1 = SingleH.getInstance();
        SingleH s2 = SingleH.getInstance();
        System.out.println(s1);
        System.out.println(s2);
        
//        new SingleL();    //报错：访问 private 
        SingleL s3 = SingleL.getInstance();
        SingleL s4 = SingleL.getInstance();
        System.out.println(s3);
        System.out.println(s4);
    }
}